﻿package peace.graphic.tween {
import peace.graphic.tween.easing.Easing;
import peace.graphic.tween.easing.NoneEasing;

/**
 * Отвечает за хранение информации и отрисовку изменений набора свойств
 * одного клипа с общим временем анимации (duration) и ускорением (easing).
 */
public class Motion {

    public var target:Object;

    public var easing:Easing;

    public var duration:uint;

    public var delay:int;
    /**
     * массив TweenParameter
     */
    public var parameters:Array = new Array();

    protected var time:int;

    /**
     * @param target цель анимации
     * @param duration длтельность в кадрах
     * @param easing правило движения с ускорением
     * @param delay задержка перед началом в общей Tween
     */
    public function Motion(target:Object = null, duration:uint = 100, easing:Easing = null, delay:int = 0) {
        this.target = target;
        this.easing = easing == null ? new NoneEasing() : easing;
        this.duration = duration;
        this.delay = delay;
    }

    public function addParameter(p:TweenParameter):void {
        parameters.push(p);
    }

    public function removeParameter(p:TweenParameter):TweenParameter {
        var index:int = parameters.indexOf(p);
        if (index > -1) {
            parameters.splice(index, 1);
        }
        return p;
    }

    public function clearParameters():void {
        parameters = [];
    }

    public function render(t:int):void {
        if (target) {
            t = t - delay;

            // ждем начала анимации (окончания задержки)
            if (t < 0) return;

            if (t >= duration) {
                t = duration;
            }
            time = t;

            for each (var p:TweenParameter in parameters) {
                target[p.name] = easing.getValue(time, p.begin, p.delta, duration);
            }
        }
    }
}
}
